package ar.com.jendrix.login.service.impl;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import ar.com.jendrix.common.exception.SystemException;
import ar.com.jendrix.common.exception.ValidationException;
import ar.com.jendrix.common.persistence.entity.service.BaseEntityService;
import ar.com.jendrix.common.persistence.manager.BaseEntityDAO;
import ar.com.jendrix.common.util.Comparator;
import ar.com.jendrix.common.util.MessageBuilder;
import ar.com.jendrix.login.dao.RolDAOImpl;
import ar.com.jendrix.login.dto.RolDTO;
import ar.com.jendrix.login.entity.Rol;
import ar.com.jendrix.login.query.RolQuery;
import ar.com.jendrix.login.service.RolService;

@Stateless
public class RolServiceImpl extends BaseEntityService<RolDTO, Rol> implements RolService {

	@EJB
	private RolDAOImpl rolDAO;

	@Override
	protected BaseEntityDAO<Rol> getEntityDAO() {
		return rolDAO;
	}

	@Override
	public final Rol mapToEntity(RolDTO dto) throws SystemException {
		Rol rol = new Rol();

		if (!Comparator.isEmpty(dto.getId())) {
			rol = getEntityDAO().get(dto.getId());
		}

		rol.setAplicacion(dto.getAplicacionDTO().getAplicacion());
		rol.setNombre(dto.getNombre());
		rol.setDescripcion(dto.getDescripcion());
		rol.setVigencia(dto.getVigencia().toEntity());

		return rol;
	}

	@Override
	public final RolDTO mapToDTO(Rol rol) {
		RolDTO dto = new RolDTO();
		dto.setId(rol.getId());
		dto.getAplicacionDTO().setAplicacion(rol.getAplicacion());
		dto.setNombre(rol.getNombre());
		dto.setDescripcion(rol.getDescripcion());
		dto.setVigencia(rol.getVigencia().toDTO());
		return dto;
	}

	@Override
	protected final void validEntityData(RolDTO dto) throws ValidationException {
		MessageBuilder messageBuilder = new MessageBuilder();

		if (Comparator.isEmpty(dto.getAplicacionDTO().getAplicacion())) {
			messageBuilder.addMessage("Debe seleccionar la aplicacion");
		}

		if (Comparator.isEmpty(dto.getNombre())) {
			messageBuilder.addMessage("Debe completar el nombre");
		}

		if (!messageBuilder.isEmpty()) {
			throw new ValidationException(messageBuilder.getMessages());
		}
	}

	@Override
	protected final void validEntityConstraint(RolDTO dto) throws ValidationException, SystemException {
		if (Comparator.isEmpty(dto.getId())) {
			boolean existeRol = rolDAO.existeRol(dto.getAplicacionDTO().getAplicacion(), dto.getNombre());
			if (existeRol) {
				String mensaje = String.format("El Rol %s ya existe para la aplicacion %s", dto.getNombre(), dto.getAplicacionDTO().getAplicacion()
						.getDescripcion());
				throw new ValidationException(mensaje);
			}
		}
	}

	@Override
	public final List<RolDTO> search(RolQuery rolQuery) throws SystemException {
		List<RolDTO> dtoList = null;
		try {
			List<Rol> entityList = rolDAO.search(rolQuery);
			dtoList = mapToDTO(entityList);
		} catch (Throwable t) {
			throw new SystemException(t);
		}
		return dtoList;
	}
}